awk回顧
awk - 簡介 Linux 製表好工具
複習一下awk格式awk [options] 'command' file(s)
這裡command
也有自己的格式pattern {awk操作命令}
patter
可以是Regex也可以是邏輯判斷式
上一篇有稍微用到UID>100這邏輯判斷式;
所以也有常見的==
、!=
、>
、<
等等的邏輯判斷符號.
繼續玩, 接著著重在Regex邏輯判斷上~
表示匹配後面的Regex!~
表示不匹配後面的Regex
透過~/RegexPattern/
awk -F ':' '$1~/^r.*/{print $1}' /etc/passwd
# ^是Regex的符號, 用來表示下一個符號一定是搜尋對象的開頭
# .代表任意符號
# *則代表前一個符號可以出現任意次數
透過!~/RegexPattern/
awk -F ':' '$1!~/^r.*/{print $1}' /etc/passwd
透過$3==100
做pattern; {print $1,$3}
是awk操作命令
awk -F ':' '$3==100{print $1,$3}' /etc/passwd
awk [options] 'command' file(s)
command可以有BEGIN
與END
; 分別在pattern {awk commands}的之前與之後套用的,BEGIN
會在讀取任何輸入行資料之前執行, 哪怕pattern沒中半個END
在awk退出前執行
製作表格,顯示/etc/passwd每行的行號, 字段數量, 用戶名稱
awk -F ':' 'BEGIN{print "Ln WordCnt User"}{print NR, NF, $1}END{print"----"FILENAME"----"}' /etc/passw
結果有出來, 但格式不如預期
這次不自己用空格做編排, 改用\t
水平製表符號(tab)
awk -F ':' 'BEGIN{print "Ln \tWordCnt \tUser"}{print NR "\t" NF "\t" $1}END{print"----"FILENAME"----"}' /etc/passwd
是不是整整齊齊的了
透過BEGIN來設定字串分隔符號
之前都是透過option-F
現在也能透過BEGIN
加上FS
欄位分隔符號做設定
剛剛的例子改成
awk 'BEGIN{FS=":"; print "Ln \tWordCnt \tUser"}{print NR "\t" NF "\t" $1}END{print"----"FILENAME"----"}' /etc/passwd
能達成跟上圖一樣的字串分隔效果與顯示結果
輸出也不只是能有空格或tab
能搭配OFS
輸出欄位分隔符號, 來做設定
cat grepText.txt; \
awk 'BEGIN{OFS="-"}{print $1,$2,$3}' grepText.txt
love loove live l0ve lOve l@ve lovelove
可以看到本來輸出應該是空格的, 但透過OFS
改成-
做拼接
玩個無聊的功能
/etc/passswd的UserName我不想給人看到, 做個遮罩
awk 'BEGIN{FS=":"; print "Ln\tWordCnt\tUId\tUser"}{$3="xxxx"; print NR "\t" NF "\t" $3"\t"$1}END{print"----"FILENAME"----"}' /etc/passwd
$3="xxxx"
也能直接在awk操作命令中, 對某一個字段做值的賦予
如果有多個command, 要用;
做區隔